package com.seven.leetcode.problems;

/**
 * 263. 丑数
 * https://leetcode-cn.com/problems/ugly-number/
 * 级别：Easy
 * <p>
 * 给你一个整数 n ，请你判断 n 是否为 丑数 。如果是，返回 true ；否则，返回 false 。
 * 丑数 就是只包含质因数 2、3 和/或 5 的正整数。
 * <p>
 * 示例 1：
 * 输入：n = 6
 * 输出：true
 * 解释：6 = 2 × 3
 * <p>
 * 示例 2：
 * 输入：n = 8
 * 输出：true
 * 解释：8 = 2 × 2 × 2
 * <p>
 * 示例 3：
 * 输入：n = 14
 * 输出：false
 * 解释：14 不是丑数，因为它包含了另外一个质因数 7 。
 * <p>
 * 示例 4：
 * 输入：n = 1
 * 输出：true
 * 解释：1 通常被视为丑数。
 *
 * @author : wenguang
 * @date : 2021/4/02 10:42
 */
public class UglyNumber {

    public static void main(String[] args) {
        int n = 2;
        System.out.println("in: \nn:" + n);
        boolean result = isUgly(n);
        System.out.println("out: " + result);
    }

    public static boolean isUgly(int n) {
        if (n == 0) {
            return false;
        }
        if (n == 1) {
            return true;
        }
        if (n % 2 == 0) {
            return isUgly(n / 2);
        }
        if (n % 3 == 0) {
            return isUgly(n / 3);
        }
        if (n % 5 == 0) {
            return isUgly(n / 5);
        }
        return false;
    }

    public static boolean isUgly1(int n) {
        if (n < 1) {
            return false;
        }

        while (n % 5 == 0) {
            n /= 5;
        }
        while (n % 3 == 0) {
            n /= 3;
        }
        while (n % 2 == 0) {
            n /= 2;
        }

        return n == 1;
    }

    public static boolean isUgly2(int n) {
        if (n < 1) {
            return false;
        }

        while (true) {
            if (n == 1) {
                return true;
            } else if (n % 2 == 0) {
                n = n >> 1;
            } else if (n % 3 == 0) {
                n = n / 3;
            } else if (n % 5 == 0) {
                n = n / 5;
            } else {
                return false;
            }
        }
    }
}
